//package com.huaweiyuntest.springbootdemo.controller;
//
//import com.lowagie.text.*;
//import com.lowagie.text.Font;
//import com.lowagie.text.Rectangle;
//import com.lowagie.text.pdf.*;
//
//import java.awt.*;
//import java.io.FileOutputStream;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//  使用 openpdf
//public class pdfTest3 {
//    private static final String CHINESE_FONT_PATH = "/Users/mac/yangxulong/CE/tmp/pdf-generator/AlibabaPuHuiTi-3-55-Regular.ttf";
//    private static final String CHINESE_FONT_BOLD_PATH = "/Users/mac/yangxulong/CE/tmp/pdf-generator/AlibabaPuHuiTi-3-85-Bold.ttf";
//    private static final String OUTPUT_PATH = "/Users/mac/yangxulong/CE/tmp/result_final_openpdf.pdf";
//    private static final String TEMPLATE_PATH = "/Users/mac/yangxulong/CE/tmp/pdf_template-2.pdf";
//
//    private static final float[] COLUMN_WIDTHS = {
//            8, 5, 7, 6, 7, 6, 7, 8, 10, 8, 6, 9, 7, 8, 7
//    };
//
//    private static final String[] TABLE_HEADERS = {
//            "订单编号", "状态", "业务场景", "通道类型", "资源编号",
//            "成交数量", "成交单价", "成交总额", "成交时间", "产品名称",
//            "交割地", "客户名称", "业务单位", "签约甲方", "二级单位"
//    };
//
//    // 新增：第一页表格距离顶部的距离
//    private static final float FIRST_PAGE_TOP_MARGIN = 200f;
//
//    public static void generatePdf(List<OrderDetail> orderList, String title, String businessUnit) throws Exception {
//        PdfReader reader = new PdfReader(TEMPLATE_PATH);
//        Rectangle pageSize = reader.getPageSize(1);
//        float pageWidth = pageSize.getWidth();
//        float pageHeight = pageSize.getHeight();
//
//        BaseFont baseFont = BaseFont.createFont(CHINESE_FONT_PATH, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//        BaseFont boldFont = BaseFont.createFont(CHINESE_FONT_BOLD_PATH, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
//        Font titleFont = new Font(boldFont, 18, Font.BOLD, new Color(0, 0, 0));
//        Font headerFont = new Font(boldFont, 9, Font.BOLD, new Color(60, 60, 60));
//        Font cellFont = new Font(baseFont, 8, Font.NORMAL, new Color(0, 0, 0));
//        Font businessFont = new Font(baseFont, 11, Font.NORMAL, new Color(0, 0, 0));
//        Font businessLabelFont = new Font(boldFont, 14, Font.BOLD, new Color(0, 0, 0));
//
//        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(OUTPUT_PATH));
//        int pageNum = 1;
//        int rowIndex = 0;
//        int totalRows = orderList.size();
//
//        float tableStartX = 20f;
//        float tableWidth = pageWidth -  2*tableStartX;
//        float tableStartY = pageHeight - 90; // 其余页的表格起始Y
//
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//
//        boolean isFirstPage = true;
//        while (rowIndex < totalRows) {
//            if (isFirstPage) {
//                // 第一页用模板
//                PdfContentByte cb = stamper.getOverContent(pageNum);
//
//                // 标题
//                ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, new Phrase(title, titleFont), pageWidth / 2, pageHeight - FIRST_PAGE_TOP_MARGIN + 130, 0);
//
//                // 业务单位
//                Phrase businessPhrase = new Phrase();
//                businessPhrase.add(new Chunk("业务单位: ", businessLabelFont));
//                businessPhrase.add(new Chunk(businessUnit, businessFont));
//                ColumnText.showTextAligned(cb, Element.ALIGN_LEFT, businessPhrase, tableStartX, pageHeight - FIRST_PAGE_TOP_MARGIN + 60, 0);
//
//                // 构建表格（带表头）
//                PdfPTable table = new PdfPTable(COLUMN_WIDTHS);
//                table.setTotalWidth(tableWidth);
//                table.setLockedWidth(true);
//
//                // 表头
//                for (String header : TABLE_HEADERS) {
//                    PdfPCell headerCell = new PdfPCell(new Phrase(header, headerFont));
//                    headerCell.setBackgroundColor(new Color(240, 240, 240));
//                    headerCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//                    headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//                    headerCell.setPadding(4f);
//                    headerCell.setBorderWidth(0.5f);
//                    table.addCell(headerCell);
//                }
//
//                // 填充本页数据
//                float curHeight = table.getTotalHeight();
//                int rowsThisPage = 0;
//                int startRowIndex = rowIndex;
//                float firstPageTableStartY = pageHeight - FIRST_PAGE_TOP_MARGIN;
//                while (rowIndex < totalRows) {
//                    addOrderRow(table, orderList.get(rowIndex), cellFont, sdf);
//                    rowsThisPage++;
//                    table.completeRow();
//                    float newHeight = table.getTotalHeight();
//                    if (firstPageTableStartY - newHeight < 40) { // 预留底部40
//                        table.deleteLastRow();
//                        break;
//                    }
//                    curHeight = newHeight;
//                    rowIndex++;
//                }
//                table.writeSelectedRows(0, -1, tableStartX, firstPageTableStartY, cb);
//
//                isFirstPage = false;
//                pageNum++;
//            } else {
//                // 后续页：新建空白页，只有表格数据，无表头
//                stamper.insertPage(pageNum, pageSize);
//                PdfContentByte cb = stamper.getOverContent(pageNum);
//
//                PdfPTable table = new PdfPTable(COLUMN_WIDTHS);
//                table.setTotalWidth(tableWidth);
//                table.setLockedWidth(true);
//
//                float curHeight = table.getTotalHeight();
//                int rowsThisPage = 0;
//                int startRowIndex = rowIndex;
//                while (rowIndex < totalRows) {
//                    addOrderRow(table, orderList.get(rowIndex), cellFont, sdf);
//                    rowsThisPage++;
//                    table.completeRow();
//                    float newHeight = table.getTotalHeight();
//                    if (tableStartY - newHeight < 40) { // 预留底部40
//                        table.deleteLastRow();
//                        break;
//                    }
//                    curHeight = newHeight;
//                    rowIndex++;
//                }
//                table.writeSelectedRows(0, -1, tableStartX, tableStartY, cb);
//
//                pageNum++;
//            }
//        }
//
//        stamper.close();
//        reader.close();
//        System.out.println("PDF生成完成：" + OUTPUT_PATH);
//    }
//
//    private static void addOrderRow(PdfPTable table, OrderDetail order, Font cellFont, SimpleDateFormat sdf) {
//        String[] cellData = {
//                order.getOrderNo(),
//                order.getStatus(),
//                order.getBusinessScene(),
//                order.getChannelType(),
//                order.getResourceNo(),
//                order.getDealQty() != null ? order.getDealQty().toString() : "",
//                order.getDealPrice() != null ? String.format("%.2f", order.getDealPrice()) : "",
//                order.getDealAmount() != null ? String.format("%.2f", order.getDealAmount()) : "",
//                order.getDealTime() != null ? sdf.format(order.getDealTime()) : "",
//                order.getProductName(),
//                order.getDeliveryPlace(),
//                order.getCustomerName(),
//                order.getBusinessUnit(),
//                order.getSigningParty(),
//                order.getSecondaryUnit()
//        };
//        for (String data : cellData) {
//            PdfPCell dataCell = new PdfPCell(new Phrase(data == null ? "" : data, cellFont));
//            dataCell.setHorizontalAlignment(Element.ALIGN_CENTER);
//            dataCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//            dataCell.setPadding(5f);
//            dataCell.setBorderWidth(0.5f);
//            table.addCell(dataCell);
//        }
//    }
//
//    public static void main(String[] args) throws Exception {
//        List<OrderDetail> orderList = new ArrayList<>();
//        for (int i = 1; i <= 200; i++) { // 多行测试分页
//            orderList.add(new OrderDetail(
//                    "ORDER" + String.format("%06d", i),
//                    "计入-已确认",
//                    "化工品销售",
//                    "普通订单",
//                    "RES" + String.format("%06d", i),
//                    i % 100 + 1,
//                    8000.00 + (i % 1000),
//                    (8000.00 + (i % 1000)) * (i % 100 + 1),
//                    parseDate("2025-01-01 00:00:00"),
//                    "产品" + i,
//                    "交割地" + (i % 10),
//                    "客户" + (i % 100),
//                    "业务单位" + (i % 5),
//                    "签约甲方" + (i % 3),
//                    "二级单位" + (i % 7)
//            ));
//        }
//        generatePdf(
//                orderList,
//                "国能e商平台成交信息明细 (2025-01-01至2025-09-30)",
//                "国家能源集团宁夏煤业有限责任公司煤制油化工销售分公司"
//        );
//    }
//
//    private static Date parseDate(String dateStr) {
//        try {
//            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr);
//        } catch (Exception e) {
//            return new Date();
//        }
//    }
//
//    public static class OrderDetail {
//        private String orderNo;
//        private String status;
//        private String businessScene;
//        private String channelType;
//        private String resourceNo;
//        private Integer dealQty;
//        private Double dealPrice;
//        private Double dealAmount;
//        private Date dealTime;
//        private String productName;
//        private String deliveryPlace;
//        private String customerName;
//        private String businessUnit;
//        private String signingParty;
//        private String secondaryUnit;
//
//        public OrderDetail(String orderNo, String status, String businessScene, String channelType, String resourceNo,
//                           Integer dealQty, Double dealPrice, Double dealAmount, Date dealTime, String productName,
//                           String deliveryPlace, String customerName, String businessUnit, String signingParty,
//                           String secondaryUnit) {
//            this.orderNo = orderNo;
//            this.status = status;
//            this.businessScene = businessScene;
//            this.channelType = channelType;
//            this.resourceNo = resourceNo;
//            this.dealQty = dealQty;
//            this.dealPrice = dealPrice;
//            this.dealAmount = dealAmount;
//            this.dealTime = dealTime;
//            this.productName = productName;
//            this.deliveryPlace = deliveryPlace;
//            this.customerName = customerName;
//            this.businessUnit = businessUnit;
//            this.signingParty = signingParty;
//            this.secondaryUnit = secondaryUnit;
//        }
//
//        public String getOrderNo() {
//            return orderNo;
//        }
//
//        public String getStatus() {
//            return status;
//        }
//
//        public String getBusinessScene() {
//            return businessScene;
//        }
//
//        public String getChannelType() {
//            return channelType;
//        }
//
//        public String getResourceNo() {
//            return resourceNo;
//        }
//
//        public Integer getDealQty() {
//            return dealQty;
//        }
//
//        public Double getDealPrice() {
//            return dealPrice;
//        }
//
//        public Double getDealAmount() {
//            return dealAmount;
//        }
//
//        public Date getDealTime() {
//            return dealTime;
//        }
//
//        public String getProductName() {
//            return productName;
//        }
//
//        public String getDeliveryPlace() {
//            return deliveryPlace;
//        }
//
//        public String getCustomerName() {
//            return customerName;
//        }
//
//        public String getBusinessUnit() {
//            return businessUnit;
//        }
//
//        public String getSigningParty() {
//            return signingParty;
//        }
//
//        public String getSecondaryUnit() {
//            return secondaryUnit;
//        }
//    }
//}